import os
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
from config.crypto_config import MODEL_NAME, API_KEY, API_URL, SYSTEM_MESSAGE_TEMPLATES

class LLMService:
    """LLM服务类，封装大语言模型调用"""
    
    def __init__(self):
        # 清理可能影响openai客户端的代理环境变量
        self._clean_proxy_env()
        
        try:
            # 使用更兼容的初始化方式，避免传递可能导致问题的参数
            self.llm = ChatOpenAI(
                model=MODEL_NAME,
                openai_api_key=API_KEY,
                openai_api_base=API_URL,
                temperature=0.1,  # 添加温度参数
                max_tokens=4096,   # 添加最大token参数
                timeout=60         # 添加超时参数
            )
        except Exception as e:
            print(f"LLM初始化失败: {e}")
            # 如果初始化失败，尝试更简化的初始化方式
            try:
                self.llm = ChatOpenAI(
                    model=MODEL_NAME,
                    openai_api_key=API_KEY,
                    openai_api_base=API_URL
                )
            except Exception as e2:
                print(f"LLM第二次初始化失败: {e2}")
                # 最后的备选方案，只传递最基本的参数
                self.llm = ChatOpenAI(
                    model=MODEL_NAME,
                    openai_api_key=API_KEY
                )
    
    def _clean_proxy_env(self):
        """清理代理环境变量，避免openai客户端初始化问题"""
        proxy_vars = ['HTTP_PROXY', 'HTTPS_PROXY', 'http_proxy', 'https_proxy', 'NO_PROXY', 'no_proxy']
        for var in proxy_vars:
            if var in os.environ:
                print(f"清理代理环境变量: {var}")
                del os.environ[var]
    
    def get_llm(self):
        """获取LLM实例"""
        return self.llm
    
    def generate_response(self, prompt, system_message=None):
        """
        生成LLM响应
        
        Args:
            prompt (str): 用户提示词
            system_message (str): 系统消息，默认为配置中的系统消息
            
        Returns:
            str: LLM响应内容
        """
        if system_message is None:
            system_message = SYSTEM_MESSAGE_TEMPLATES
            
        messages = [
            SystemMessage(content=system_message),
            HumanMessage(content=prompt)
        ]
        
        try:
            response = self.llm(messages)
            return response.content
        except Exception as e:
            print(f"LLM响应生成失败: {e}")
            return f"LLM服务暂时不可用，错误信息: {str(e)}"
    
    def generate_code(self, prompt, system_message=None):
        """
        生成代码的专用方法
        
        Args:
            prompt (str): 代码生成提示词
            system_message (str): 系统消息
            
        Returns:
            str: 生成的代码
        """
        return self.generate_response(prompt, system_message) 